/**
 * 本地测试组件合并工具模板
 * Phase 5 集成验证关键工具
 *
 * 用途：将LOCAL_TEST_COMPONENTS合并到API组件列表中
 * 位置：src/utils/mergeLocalComponents.ts
 *
 * 实际范例: cases/code/UsageTrendsProd2/src/utils/mergeLocalComponents.ts
 * 注册配置: templates/critical-files-snippets.md#LOCAL_TEST_COMPONENTS
 * 集成指南: phase5-troubleshooting-guide.md
 *
 * @template Phase5/ComponentMerger
 * @version 2.0.0
 * @author AI Assistant
 * @date 2025-11-10
 *
 * 基于实际运行版本提取（src/utils/mergeLocalComponents.ts）
 */

import { LOCAL_TEST_COMPONENTS } from '@/constants/constants';

interface ComponentItem {
  componentCode?: string;
  [key: string]: any;
}

interface SubGroupItem {
  groupId?: number;
  groupName?: string;
  thumbnail?: string;
  componentList?: ComponentItem[];
}

interface GroupItem {
  groupId?: number;
  groupName?: string;
  groupCode?: string;
  thumbnail?: string;
  subGroupList?: SubGroupItem[];
}

/**
 * 深拷贝子分组
 */
const cloneSubGroup = (sub: SubGroupItem): SubGroupItem => ({
  ...sub,
  componentList: [...(sub.componentList || [])],
});

/**
 * 深拷贝分组
 */
const cloneGroup = (group: GroupItem): GroupItem => ({
  ...group,
  subGroupList: (group.subGroupList || []).map(cloneSubGroup),
});

/**
 * 合并本地测试组件到现有组件列表
 * @param originList 原始组件列表（来自API + CONTAINER_LIST）
 * @returns 合并后的组件列表
 *
 * 调用场景：
 * - src/pages/editor/index.tsx:321
 * - src/pages/newPageList/NewBtn.tsx
 * - src/pages/newPageList/pageVerList.tsx
 */
export const mergeLocalComponents = (originList: GroupItem[] = []): GroupItem[] => {
  // 如果没有本地测试组件，直接返回原始列表
  if (!LOCAL_TEST_COMPONENTS || LOCAL_TEST_COMPONENTS.length === 0) {
    return originList;
  }

  // 深拷贝原始列表，避免修改原数据
  const cloned = originList.map(cloneGroup);

  // 合并本地组件到现有列表
  LOCAL_TEST_COMPONENTS.forEach((localGroup) => {
    // 通过 groupCode 或 groupName 查找现有分组
    const targetGroup = cloned.find(
      (group) => group.groupCode === localGroup.groupCode || group.groupName === localGroup.groupName,
    );

    if (targetGroup) {
      // 如果找到现有分组，合并子分组
      localGroup.subGroupList?.forEach((localSub) => {
        const targetSub = targetGroup.subGroupList?.find((sub) => sub.groupName === localSub.groupName);

        if (targetSub) {
          // 如果找到现有子分组，添加组件（去重）
          const existCodes = new Set((targetSub.componentList || []).map((item) => item.componentCode));
          (localSub.componentList || []).forEach((comp) => {
            if (!existCodes.has(comp.componentCode)) {
              targetSub.componentList = [...(targetSub.componentList || []), { ...comp }];
              existCodes.add(comp.componentCode);
            }
          });
        } else {
          // 如果没有找到子分组，添加新子分组
          targetGroup.subGroupList = [...(targetGroup.subGroupList || []), cloneSubGroup(localSub)];
        }
      });
    } else {
      // 如果没有找到分组，添加新分组
      cloned.push(cloneGroup(localGroup));
    }
  });

  return cloned;
};

/**
 * 检查组件是否为本地AI组件
 * 用于DragPanel判断数据加载方式
 */
export const isLocalAIComponent = (componentCode: string): boolean => {
  return LOCAL_TEST_COMPONENTS.some((group) =>
    group.subGroupList.some((subGroup) =>
      subGroup.componentList.some((component) => component.componentCode === componentCode)
    )
  );
};

export default mergeLocalComponents;

/*
使用方法：

1. 在需要合并的文件中导入：
   import { mergeLocalComponents } from '@/utils/mergeLocalComponents';

2. 在获取API组件数据后调用：
   const allComList = remoteComponentList || [];
   const mergedComList = mergeLocalComponents([...CONTAINER_LIST, ...allComList]);

3. 处理结果数据：
   const currComList = mergedComList.map((item: any) => ({
     firstCatg: item?.groupName,
     groupCode: item?.groupCode,
     children: (item?.subGroupList || []).map(...)
   }));

核心特性：
- 深拷贝：避免修改原始数据
- 智能合并：通过groupCode或groupName匹配现有分组
- 去重机制：基于componentCode防止重复添加
- 分层支持：支持分组 -> 子分组 -> 组件的三层结构
- 新分组创建：不存在的分组会自动创建
- 安全性：空值检查和容错处理

验证清单：
□ groupCode匹配现有分组
□ componentCode唯一且有意义
□ 深拷贝避免副作用
□ 去重机制防止重复
□ 三层结构完整支持
*/
